#ifndef _MOTOR_BOARD_H_
#define _MOTOR_BOARD_H_

#include <config.h>
#include <stdbool.h>

#if _UNLOCK_TYPE_ == _UNLOCK_MOTOR_

#if _BOARD_TYPE_ == _V31_A_BOARD_
// 电机 - 正转
#define TIM8837_FOR_PIN                       GPIO_Pin_2
// 电机 - 反转
#define TIM8837_BAK_PIN                       GPIO_Pin_3
// 电机 - 使能
#define TIM8837_EN_PIN                        GPIO_Pin_4

#elif _BOARD_TYPE_ == _V32_A_BOARD_
// 电机 - 正转
#define TIM8837_FOR_PIN                       GPIO_Pin_12
// 电机 - 反转
#define TIM8837_BAK_PIN                       GPIO_Pin_11
// 电机 - 使能
#define TIM8837_EN_PIN                        GPIO_Pin_13

#elif _BOARD_TYPE_ == _V32_B_BOARD_
// 电机 - 正转
#define TIM8837_FOR_PIN                       GPIO_Pin_1
// 电机 - 反转
#define TIM8837_BAK_PIN                       GPIO_Pin_2
// 电机 - 使能
#define TIM8837_EN_PIN                        GPIO_Pin_16

#elif _BOARD_TYPE_ == _V33_A_BOARD_
// 电机 - 反转
#define TIM8837_BAK_PIN                       GPIO_Pin_3
// 电机 - 正转
#define TIM8837_FOR_PIN                       GPIO_Pin_4
// 电机 - 使能
#define TIM8837_EN_PIN                        GPIO_Pin_2

#elif _BOARD_TYPE_ == _V33_B_BOARD_
// 电机 - 反转
#define TIM8837_BAK_PIN                       GPIO_Pin_1
// 电机 - 正转
#define TIM8837_FOR_PIN                       GPIO_Pin_2
// 电机 - 使能
#define TIM8837_EN_PIN                        GPIO_Pin_3

#elif _BOARD_TYPE_ == _V33_C_BOARD_
// 电机 - 反转
#define TIM8837_BAK_PIN                       GPIO_Pin_1
// 电机 - 正转
#define TIM8837_FOR_PIN                       GPIO_Pin_2
// 电机 - 使能
#define TIM8837_EN_PIN                        GPIO_Pin_3
#endif

/**
 * @brief 电机状态
 *
 */
typedef enum
{
  TIM8837_HARDWARE_INIT,     // 初始化
  TIM8837_HARDWARE_SLEEP,    // 睡眠
  TIM8837_HARDWARE_STANDBY,  // 待机
  TIM8837_HARDWARE_FOREWARD, // 正转
  TIM8837_HARDWARE_REVERSAL, // 反转
} Tim8837Status_t;

#else
#if _BOARD_TYPE_ == _DA01_A_BOARD_
// 继电器控制线
#define RELAY_CONTORL_PIN                      GPIO_Pin_15
#elif _BOARD_TYPE_ == _CR01_BU_
// 继电器控制线
#define RELAY_CONTORL_PIN                      GPIO_Pin_9
#endif

/**
 * @brief 继电器状态
 *
 */
typedef enum
{
  RELAY_HARDWARE_LOCKED,      // 上锁
  RELAY_HARDWARE_UNLOCK,      // 开锁
  RELAY_HARDWARE_NORMAL_OPEN, // 常开
} RelayStatus_t;
#endif

/**
 * @brief 电机状态
 *
 */
typedef enum
{
  MOTOR_LOCK,          // 上锁
  MOTOR_UNLOCKING,     // 开锁
  MOTOR_NORMALLY_OPEN, // 常开
} MotorLockStatus_t;

/**
 * @brief 电机任务回调
 *
 */
extern void MotorTaskCallback(void);

/**
 * @brief 更新电机状态
 *
 * @param NewStatus - 新状态
 */
extern void UpdateMotorActionStatus(MotorLockStatus_t NewStatus);

/**
 * @brief 获取电机状态
 *
 * @return MotorLockStatus_t - 电机状态
 */
extern MotorLockStatus_t GetMotorActionStatus(void);

/**
 * @brief 上电初始化
 *
 */
extern void MotorPowerUpInitialization(void);

/**
 * @brief 电机板载功能初始化
 *
 */
extern void MotorBoardInitialisation(void);

#endif
